'''
普通dfs是150 ** 4
大概5亿次计算。这不是为难python吗
python好像做百万级别的都费劲。。
然后我自己想了想别的辙，（再加上百度（小声）），写了下面的方法！（还没写呢，时间复杂度一会儿再算）
跟网上我看的也不太一样哦，我自己总结的方法
太妙了，真的，这题我用python过了，真的特激动！呜呜呜！
时间复杂度是O(150^2*2)！！才大概5w！
'''
def dfs(t, i, j, sm):
    if i == j:
        t[sm] = t.get(sm, 0) + 1
        return
    for k in range(1, m + 1):
        dfs(t, i + 1, j, sm + x[i] * (k ** p[i]))

n = int(input())
m = int(input())
x = [0 for i in range(n)]
p = [0 for i in range(n)]
for i in range(n):
    x[i], p[i] = map(int, input().split())
# 两个字典，各存一半数的所有可能结果以及出现的次数。
a, b = {}, {}
# 递归给字典赋值
dfs(a, 0, n//2, 0)
dfs(b, n//2, n, 0)
# 把其中一个字典的值全改为相反的值
a_ = set(map(lambda x: -x, a.keys()))
# 获取这个新的集合和b的键的集合的交集
# 代表a,b两个集合相加后为0的数的集合！
a_b = a_ & b.keys()
s = 0
# 遍历获取这个集合中的值对应的在b中的值和在a中的值，相乘后加起来就是所有可能数
for i in a_b:
    s += b[i] * a[-i]
# 说起来，我这里之前只写了b[i]，没管a，好巧不巧，我前面把n//2写成了n//i
# 于是导致a里有且只有一个数的。于是一般情况下，每个值都只有一种可能
# 于是任何数乘1都是他本身。于是阴差阳错地就对了233333那个时候其实是个O(150^3)的解法
# 而且不保证对的那种。还挺神奇的，2个bug导致程序勉强正常运行了233333要不是后来又写java题解
# 我还没发现。
print(s)
# -------------------------------------------------------------------------------

# 比赛环境为python3.8.6版本自带的IDLE，最好早点熟悉一下。。这个东西的提示时有时无

# 菜单栏最右边的Help的Python Docs 比赛时候也可以看，不过建议还是提前多了解了解，

# 比赛的时候至少知道在文档找什么能用的上。

# IDLE是下载Python时自带的，在按住win+s搜索IDLE就能搜到了。

# 然后点左上角的File可以创建新文件，然后按F5可以运行。
